#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
const char * s = "./";
const int commonid = 0x11223344;
const char * path = "fifo"; // 写
int main()
{
    key_t key = ftok(s, commonid); // hash生成随机数,s所表示的目录或文件一定要存在
    if(key < 0)
    {
        perror("ftok");
        return 0;
    }

    int shmid = shmget(key, 1024, IPC_CREAT); // 申请共享内存，没有则创建，有则返回共享内存的标识符
    printf("%d\n",shmid);
    if(shmid == -1)
    {
        perror("shmid");
        return 0;
    }
    char * p = (char*)shmat(shmid, NULL, 0); // 获取共享内存的地址---与页表建立映射关系
    memset(p, 'a', 26);
    int fd = open(path, O_WRONLY);
    int code = 1;
    for(int i = 0; i < 26; i++)
    {
        p[i] = 'a' + i;
        sleep(2);
        int n = write(fd, &code, sizeof(code));
        if(n == -1)
        {
            perror("write");
            break;
        }
    }
    shmdt(p); // 取消映射
    // shmctl(shmid, IPC_RMID, NULL); // 释放shmid对于共享内存的引用

    return 0;
}